//
//  VC09.swift
//  APPTestSwift
//
//  Created by hiking on 2020/3/19.
//  Copyright © 2020 hiking. All rights reserved.
//

import UIKit
//串行队列
//并行队列
//sync同步执行不会开线程，顺序执行
//async异步执行才会开线程，开一个线程执行

//串行队列（Serial Dispatch Queue）：
//每次只有一个任务被执行。让任务一个接着一个地执行。（只开启一个线程，一个任务执行完毕后，再执行下一个任务）
//并发队列（Concurrent Dispatch Queue）：
//可以让多个任务并发（同时）执行。（可以开启多个线程，并且同时执行任务）

class VC09: UIViewController {

    lazy var arr:[String] = {
        let arr = [
            "串行队列+sync同步执行",
            "串行队列+async异步步执行",
            "并行队列+sync同步执行",
            "并行队列+async异步执行",
            "主队列+async异步执行",
            "解决主队列+sync同步执行死锁"
        ]
        return arr
    }()
    
    lazy var tableView:UITableView = {
        let tableView = UITableView(frame: self.view.bounds)
        tableView.delegate = self
        tableView.dataSource = self
        tableView.register(UITableViewCell.classForCoder(), forCellReuseIdentifier: "VC09CellID")
        return tableView
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setUpUI()
    }
    func setUpUI() {
        self.view.addSubview(self.tableView)
        
    }
    func demo0() {
        print("begin")
        let queue = DispatchQueue(label: "hiking")
        for index in 1...10{
            queue.sync {
                print("No:\(index)当前线程：\(Thread.current)")
            }
        }
        print("end")
    }
    func demo1() {
           print("串行队列+async异步步执行")
           let queue = DispatchQueue(label: "hiking")
           for index in 1...10{
               queue.async {
                   print("No:\(index)当前线程：\(Thread.current)")
               }
           }
           print("end")
       }
    func demo2() {
        print("并行队列+同步执行")
        let queue = DispatchQueue(label: "hiking",attributes: .concurrent)
        for index in 1...10{
            queue.sync {
                print("No:\(index)当前线程：\(Thread.current)")
            }
        }
        print("end")
    }
    
    func demo3() {
        print("并行队列+async异步执行")
        let queue = DispatchQueue(label: "hiking",attributes: .concurrent)
        for index in 1...10{
            queue.async {
                print("No:\(index)当前线程：\(Thread.current)")
            }
        }
        print("end")
    }
    
    
    //主队列异步执行:queue.async中的任务，加在主队列的末尾，所以，主队列可以继续执行”end“
    func demo4() {
           print("主队列+async异步执行")
        let queue = DispatchQueue.main
           for index in 1...10{
               queue.async {
                   print("No:\(index)当前线程：\(Thread.current)")
               }
           }
           print("end")
       }
    func demo5() {
        print("Step1:解决主队列+sync同步执行死锁")
        //Step 3
        DispatchQueue.global().async {
            for index in 1...10{
                //因为添加任务是在子线程执行的
                DispatchQueue.main.sync {
                    print("No:\(index)当前线程：\(Thread.current)")
                }
            }
        }
        //Step 2
        print("end")
    }
//    func demo3() {
//        let mainQueue = DispatchQueue.main
//        print("begin")
//        mainQueue.sync {
//            //这里面的代码因为是在主队列中排队，当主线程（主队列）执行到“mainQueue.sync”时，
//            //同步执行（顺序执行）等待这里面的代码执行完成才往下走,但是这里面的代码在主队列的后面，他又要等主线程中的执行完才轮到他，因此死锁
//            print("造成当前线程：\(Thread.current)死锁")
//        }
//        print("end")
//    }
    

}
extension VC09: UITableViewDelegate,UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.arr.count;
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "VC09CellID", for: indexPath)
        cell.textLabel?.text = self.arr[indexPath.row]
        return cell
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        switch indexPath.row {
        case 0:
            demo0()
            break
        case 1:
            demo1()
            break
        case 2:
            demo2()
            break
        case 3:
            demo3()
            break
        case 4:
            demo4()
            break
        case 5:
            demo5()
            break
        default:
            break
        }
    }
}
